//
//  ViewController.swift
//  02-闭包
//
//  Created by 张波 on 15/6/23.
//  Copyright © 2015年 张波. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        //闭包的基本格式
        //loadData()
        
        //gcdDemo()
        
        funcDemo1()
        
        funcDemo2()
    }
    
    /**
        闭包格式
        {
            (参数) -> Void in 
            代码实现
        }
    
        in 就是用来"分隔"的
    
    */
    
    /**
    
        * 闭包的简写
    
    */
    // 闭包的简化
    func funcDemo2()
    {
        /**
            1 如果没有参数和返回值 () -> () in 可以省略
            {
                代码实现
            }
        */
        loadData2({
            print("(Testing...)")
        })
        
        loadData2()
        {
            print("()Testing...")
        }
        
        /**
            2 尾随闭包 如果 “闭包是函数的最后一个参数” 可以省略括号
        */
        loadData2
        {
            print("Testing...")
        }
    }
    
    // 闭包的基本演练
    func funcDemo1()
    {
        // 没有 self.
        loadData2({
            Void -> Void in // () -> Void in
            print("(Void -> Void Testing...)")
        })
        
        loadData2()
        {
            () -> () in //Void -> ()
            print("()() -> () Testing...")
        }
        
        loadData2 { 
            Void -> Void in // Void -> () in
            print("Void -> Void Testing...")
        }
    }
    
    func loadData2(finished:() -> Void)
    {
        print("耗时操作")
        
        //执行回调
        finished()
    }
    
    func gcdDemo()
    {
        // 在 swift 1.2 中 print 会把所有的内容混在一起输出
        // 在 swift 2.0 中 已经改进
        for _ in 0..<3
        {
            dispatch_async(dispatch_get_main_queue()){ () -> Void in
                print(NSThread.currentThread())
            }
        }
    }

    /**
        '闭包' 类似于 Block
        Block 是 C 语言的 类似于 匿名函数
        ‘闭包’ 是定义函数的 swift 中函数是一种特殊的‘闭包’
    
        ‘闭包’ 的使用 和 Block 一样 就是完成耗时操作 回调
    
        print 的效率 比 NSLog 高 非常多
    */
    
    func loadData()
    {
//        // 开启线程 耗时操作
//        dispatch_async(dispatch_get_global_queue(0,0), {
//            print("耗时操作 \(NSThread.currentThread())")
//            
//            // 主线程更新 UI
//            /**
//                闭包格式
//                {
//                    (参数) -> Void
//                    ‘in’
//                    代码实现
//                }
//            
//                in 就是用来“分隔”的
//            */
//            dispatch_async(dispatch_get_main_queue(), { () -> Void in
//                print("更新UI \(NSThread.currentThread())")
//            })
//        })
        
        // 开启线程 耗时操作
        dispatch_async(dispatch_get_global_queue(0, 0))
        {
            () -> Void in
            print("耗时操作 \(NSThread.currentThread())")
            
            // 主线程更新UI
            /**
                闭包格式
                {
                    (参数) -> Void in
                    代码实现
                }
            
                in 就是用来 ‘分隔’ 的
            */
            dispatch_async(dispatch_get_main_queue())
            {
                () -> Void in
                print("更新UI \(NSThread.currentThread())")
            }
        }
    }

}

